/* contrib/ltree/crc32.c */

/*
 * 实现了CRC-32，作为ltree中使用的。
 *
 * 请注意，CRC在GiST索引的磁盘格式中使用，因此我们
 * 必须保持向后兼容！
 */

#include "postgres.h"
#include "ltree.h"

#ifdef LOWER_NODE
#include <ctype.h>
#define TOLOWER(x)	tolower((unsigned char) (x))
#else
#define TOLOWER(x)	(x)
#endif

#include "crc32.h"
#include "utils/pg_crc.h"

unsigned int ltree_crc32_sz(const char *fc_buf, int fc_size)
{
	pg_crc32	fc_crc;
	const char *fc_p = fc_buf;

	INIT_TRADITIONAL_CRC32(fc_crc);
	while (fc_size > 0)
	{
		char		fc_c = (char) TOLOWER(*fc_p);

		COMP_TRADITIONAL_CRC32(fc_crc, &fc_c, 1);
		fc_size--;
		fc_p++;
	}
	FIN_TRADITIONAL_CRC32(fc_crc);
	return (unsigned int) fc_crc;
}
